//
//  STTools_MessageListener.m
//  Marriage
//
//  Created by coder on 2018/8/8.
//  Copyright © 2018年 stoneobs@icloud.com. All rights reserved.
//

#import "STTools_MessageListener.h"
@interface STTools_MessageListener()
@property(nonatomic, strong) NSPointerArray                     *pointArray;
@end
@implementation STTools_MessageListener
+ (STTools_MessageListener *)manger{
    static STTools_MessageListener * manger = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        manger = STTools_MessageListener.new;
    });
    return manger;
}
- (NSPointerArray *)pointArray{
    if (!_pointArray) {
        _pointArray = [NSPointerArray weakObjectsPointerArray];
    }
    return _pointArray;
}
- (void)addDelegate:(NSObject<TMReciveMessageDelegate> *)delegate{
    // NSPointArray
    [self.pointArray addPointer:(__bridge void *)delegate];
}

#pragma mark --RCIMReceiveMessageDelegate
/*!
 接收消息的回调方法
 
 @param message     当前接收到的消息
 @param left        还剩余的未接收的消息数，left>=0
 
 @discussion 如果您设置了IMKit消息监听之后，SDK在接收到消息时候会执行此方法（无论App处于前台或者后台）。
 其中，left为还剩余的、还未接收的消息数量。比如刚上线一口气收到多条消息时，通过此方法，您可以获取到每条消息，left会依次递减直到0。
 您可以根据left数量来优化您的App体验和性能，比如收到大量消息时等待left为0再刷新UI。
 */
- (void)onRCIMReceiveMessage:(RCMessage *)message
                        left:(int)left{
    
        if ([message.content isKindOfClass:NSDictionary.class]) {
            //取消无法识别的自定义消息
            return;
        }
        if (message.objectName.length < 2) {
            //取消无法识别的自定义消息
            return;
        }
        //查询是否是 被封禁
        RCTextMessage * textMessage = (id)message.content;
        if ([textMessage isKindOfClass:RCTextMessage.class]) {
            NSString * extra = textMessage.extra;
            NSData * data = [extra dataUsingEncoding:NSUTF8StringEncoding];
            if (data && extra.length) {
                NSDictionary * dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
                if ([dic isKindOfClass:NSDictionary.class]) {
                    if ([dic.allKeys containsObject:@"type"]) {
                        NSString * type = [dic[@"type"] description];
                        if ([type isEqualToString:@"band"]) {
                            //登录失效
                            [UIViewController.new.st_currentNavgationController stoneobs_fun_st_showAlertTitle:textMessage.content message:@"" andWithBlock:^(NSString *name) {
                                [STTools_UserManger.defult stoneobs_fun_removeUserPreferce];
                                RTRootNavigationController * nav = [[RTRootNavigationController alloc] initWithRootViewController:UIViewController.new];
                                UIApplication.sharedApplication.delegate.window.rootViewController = nav;
                                [UIApplication.sharedApplication.delegate.window stoneobs_fun_st_showAnimationWithType:STAnimationTypecube_stoneobs_enum];
                                [[STTools_RcImManger manger] logout];
                            }];
                        }
                        if ([type isEqualToString:@"changeUrl"]) {
                            //更换域名
//                                                                        
                        }
                    }
                }

            }
        }
    
    NSArray * array = self.pointArray.allObjects;
    for (NSObject<TMReciveMessageDelegate> * model in array) {
        if ([model respondsToSelector:@selector(onRCIMReceiveMessage:left:)]) {
            [model onRCIMReceiveMessage:message left:left];
        }
    }
    
    
    
    
    
}
/*!
 当App处于后台时，接收到消息并弹出本地通知的回调方法
 
 @param message     接收到的消息
 @param senderName  消息发送者的用户名称
 @return            当返回值为NO时，SDK会弹出默认的本地通知提示；当返回值为YES时，SDK针对此消息不再弹本地通知提示
 
 @discussion 如果您设置了IMKit消息监听之后，当App处于后台，收到消息时弹出本地通知之前，会执行此方法。
 如果App没有实现此方法，SDK会弹出默认的本地通知提示。
 流程：
 SDK接收到消息 -> App处于后台状态 -> 通过用户/群组/群名片信息提供者获取消息的用户/群组/群名片信息
 -> 用户/群组信息为空 -> 不弹出本地通知
 -> 用户/群组信息存在 -> 回调此方法准备弹出本地通知 -> App实现并返回YES        -> SDK不再弹出此消息的本地通知
 -> App未实现此方法或者返回NO -> SDK弹出默认的本地通知提示
 
 
 您可以通过RCIM的disableMessageNotificaiton属性，关闭所有的本地通知(此时不再回调此接口)。
 
 @warning 如果App在后台想使用SDK默认的本地通知提醒，需要实现用户/群组/群名片信息提供者，并返回正确的用户信息或群组信息。
 参考RCIMUserInfoDataSource、RCIMGroupInfoDataSource与RCIMGroupUserInfoDataSource
 */
-(BOOL)onRCIMCustomLocalNotification:(RCMessage*)message
                      withSenderName:(NSString *)senderName{
    //NO 弹出 YES 不弹出
    if (message.conversationType == ConversationType_CHATROOM) {
        return YES;
    }
    return NO;
}

/*!
 当App处于前台时，接收到消息并播放提示音的回调方法
 
 @param message 接收到的消息
 @return        当返回值为NO时，SDK会播放默认的提示音；当返回值为YES时，SDK针对此消息不再播放提示音
 
 @discussion 到消息时播放提示音之前，会执行此方法。
 如果App没有实现此方法，SDK会播放默认的提示音。
 流程：
 SDK接收到消息 -> App处于前台状态 -> 回调此方法准备播放提示音 -> App实现并返回YES        -> SDK针对此消息不再播放提示音
 -> App未实现此方法或者返回NO -> SDK会播放默认的提示音
 
 您可以通过RCIM的disableMessageAlertSound属性，关闭所有前台消息的提示音(此时不再回调此接口)。
 */
-(BOOL)onRCIMCustomAlertSound:(RCMessage*)message{
    //NO 有声音 YES 没声音
    return YES;
    if (message.conversationType == ConversationType_CHATROOM) {
        return YES;
    }
    return NO;
}

/*!
 消息被撤回的回调方法
 
 @param messageId 被撤回的消息ID
 
 @discussion 被撤回的消息会变更为RCRecallNotificationMessage，App需要在UI上刷新这条消息。
 */
- (void)onRCIMMessageRecalled:(long)messageId{
    NSArray * array = self.pointArray.allObjects;
    for (NSObject<TMReciveMessageDelegate> * model in array) {
        if ([model respondsToSelector:@selector(onRCIMMessageRecalled:)]) {
            dispatch_async(dispatch_get_main_queue(), ^{
                [model onRCIMMessageRecalled:messageId];
            });
            
        }
    }
    

}
@end
